package pvn.com.controls.toolbar;

import java.util.Vector;

import pvn.com.WideField;
import pvn.com.interfaces.IObjectMessageListener;
import pvn.com.locale.Planex1TraderResource;
import net.rim.device.api.i18n.ResourceBundle;
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.system.Display;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.FieldChangeListener;
import net.rim.device.api.ui.FocusChangeListener;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.NullField;
import net.rim.device.api.ui.container.HorizontalFieldManager;
import net.rim.device.api.ui.decor.BackgroundFactory;

public class Toolbar extends HorizontalFieldManager implements FieldChangeListener,
        FocusChangeListener, Planex1TraderResource {
    /** thông tin Resource Bundle*/
    ResourceBundle _res = null;
    /** độ rộng đường phân cách*/
    int separators_width = 0;
    /** field phân tách*/
    WideField separator = null;
    /** button ảnh*/
    BitmapButtonField btnRight = null;
    /** danh sách button*/
    private Vector buttons = new Vector();
    /** null filed*/
    NullField stub = null;

    /** ví trí button dang active*/
    int activeBtnIndex = 0;

    /** có focus ra ngoài hay không*/
    boolean focusFromOutside = false;

    /** fied trước đó focus*/
    int lastFocusedField = 0;
    boolean daddy = false;

    /**
     * Khởi tạo tool bar
     * @param res - ResourceBundle sẽ dùng
     */
    public Toolbar(ResourceBundle res) {
        super(1170935903116328960L);
        //thiêt lập ResourceBundle
        this._res = res;
        //thiêt lập background
        setBackground(BackgroundFactory.createBitmapBackground(Bitmap
                .getBitmapResource("images/toolbar/bg.png")));

        BitmapButtonField btn = null;
        //thiêt lập button rate
        btn = new BitmapButtonField(Bitmap.getBitmapResource("images/toolbar/1_rates_1.png"),
                Bitmap.getBitmapResource("images/toolbar/1_rates_2.png"),
                Bitmap.getBitmapResource("images/toolbar/1_rates_3.png"), res.getString(SCREEN_RATES_TITLE), SCREEN_RATES_TITLE);
        //đặt change listener
        btn.setChangeListener(this);
        //add vào danh sách button
        this.buttons.addElement(btn);
        //đặt focus listener
        btn.setFocusListener(this);
        //add button vào quản lý
        add(btn);

        //thiêt lập button favorite
        btn = new BitmapButtonField(Bitmap.getBitmapResource("images/toolbar/2_favs_1.png"),
                Bitmap.getBitmapResource("images/toolbar/2_favs_2.png"),
                Bitmap.getBitmapResource("images/toolbar/2_favs_3.png"), res.getString(SCREEN_FAVS_TITLE), SCREEN_FAVS_TITLE);
        btn.setChangeListener(this);
        this.buttons.addElement(btn);
        btn.setFocusListener(this);
        add(btn);

        //thiêt lập button trades
        btn = new BitmapButtonField(Bitmap.getBitmapResource("images/toolbar/3_open_1.png"),
                Bitmap.getBitmapResource("images/toolbar/3_open_2.png"),
                Bitmap.getBitmapResource("images/toolbar/3_open_3.png"), res.getString(SCREEN_TRADES_TITLE), SCREEN_TRADES_TITLE);
        btn.setChangeListener(this);
        this.buttons.addElement(btn);
        btn.setFocusListener(this);
        add(btn);
        
        //thiêt lập button history
        btn = new BitmapButtonField(Bitmap.getBitmapResource("images/toolbar/4_hist_1.png"),
                Bitmap.getBitmapResource("images/toolbar/4_hist_2.png"),
                Bitmap.getBitmapResource("images/toolbar/4_hist_3.png"), res.getString(SCREEN_HISTORY_TITLE), SCREEN_HISTORY_TITLE);
        btn.setChangeListener(this);
        this.buttons.addElement(btn);
        btn.setFocusListener(this);
        add(btn);

        //thiêt lập button news
        btn = new BitmapButtonField(Bitmap.getBitmapResource("images/toolbar/5_news_1.png"),
                Bitmap.getBitmapResource("images/toolbar/5_news_2.png"),
                Bitmap.getBitmapResource("images/toolbar/5_news_3.png"), res.getString(SCREEN_NEWS_TITLE), SCREEN_NEWS_TITLE);
        btn.setChangeListener(this);
        this.buttons.addElement(btn);
        btn.setFocusListener(this);
        add(btn);

      //thiêt lập button direct
        btn = new BitmapButtonField(Bitmap.getBitmapResource("images/toolbar/8_direct_1.png"),
                Bitmap.getBitmapResource("images/toolbar/8_direct_2.png"),
                Bitmap.getBitmapResource("images/toolbar/8_direct_3.png"), res.getString(SCREEN_DIRECT_TITLE), SCREEN_DIRECT_TITLE);
        btn.setChangeListener(this);
        this.buttons.addElement(btn);
        btn.setFocusListener(this);
        add(btn);
    }

    /* (non-Javadoc)
     * layout con quan lý fields
     * @see net.rim.device.api.ui.container.HorizontalFieldManager#sublayout(int, int)
     */
    protected void sublayout(int maxW, int maxH) {
    	//nếu có separator và btnRight
        if ((this.separator != null) && (this.btnRight != null)) {
        	//đặt lại separators_width
            this.separators_width = 0;
            //độ rộng các buttons đã dùng
            int width_used = 0;
            //tính toán độ rộng các buttons đã dùng
            for (int i = 0; i < this.buttons.size(); i++) {
                BitmapButtonField btni = (BitmapButtonField) this.buttons.elementAt(i);
                width_used += btni.getPreferredWidth();
            }
            //tính toán độ rộng separator
            this.separator.width = (Display.getWidth() - width_used
                    - this.btnRight.getPreferredWidth() - 10);
            //đặt layout
            this.separator.layout(this.separator.width, maxH);
            //lưu độ rộng separator
            this.separators_width = this.separator.width;
            System.out.print("separator.width " + this.separator.width + "\n");
        }
        int w = Display.getWidth();
        int h = 39;
        //khởi tạo
        super.sublayout(w, h);
        //thiết lập kích thước extent cho fields
        setExtent(w, h);
    }

    /**
     * thiết lập focus cho button chọn
     * @param id - id button chọn
     */
    public void setFocusedButton(int id) {
    	//kiểm tra trogn danh sách button
        for (int i = 0; i < this.buttons.size(); i++) {
            BitmapButtonField btn = (BitmapButtonField) this.buttons.elementAt(i);
            //nếu chọn thì đặt active cho button và lưu vị trí button đó lại
            if (btn.hint == this._res.getString(id)) {
                btn.isActive = true;
                this.activeBtnIndex = i;
            } else {// không thì bỏ active đi
                btn.isActive = false;
            }
        }
    }

    /* (non-Javadoc)
     * thực thi khi changed field
     * @see net.rim.device.api.ui.FieldChangeListener#fieldChanged(net.rim.device.api.ui.Field, int)
     */
    public void fieldChanged(Field field, int context) {
    	//gọi UiApp
        UiApplication app = UiApplication.getUiApplication();
        //lấy button
        BitmapButtonField btn = (BitmapButtonField) field;
        int tag = btn.tag;
        //tạo task runnable
        Runnable task = new Runnable(){
            
            //TODO Gencode have problem.
            private final int val_tag =0;

            public void run() {
                IObjectMessageListener ui = (IObjectMessageListener) UiApplication
                        .getUiApplication();
                ui.OnMsg(12, this.val_tag, null);
            }
        };
        //đưa task vào Uiapp
        app.invokeLater(task);
    }

    public int getPreferredHeight() {
        return 39;
    }

    /**
     * thêm 1 Separator mới vào quản lý
     * @param width - độ rộng
     */
    public void addSeparator(int width) {
        add(this.separator = new WideField(width));
        this.separators_width += width;
    }

    /**
     * thiết lập button cho btnRight
     * @param btn - button right chuyền vào
     */
    public void addRightButton(BitmapButtonField btn) {
        int width_used = this.separators_width;
        //tính toán độ rộng đã dùng
        for (int i = 0; i < this.buttons.size(); i++) {
            BitmapButtonField btni = (BitmapButtonField) this.buttons.elementAt(i);
            width_used += btni.getPreferredWidth();
        }
        //thêm Separator
        addSeparator(Display.getWidth() - width_used - btn.getPreferredWidth() - 10);
        //thiết lập FocusListener
        btn.setFocusListener(this);
        //thêm vào quản lý
        add(btn);
        //gán cho btnRight
        this.btnRight = btn;
    }

    /* (non-Javadoc)
     * khi maats focus
     * @see net.rim.device.api.ui.Manager#onUnfocus()
     */
    public void onUnfocus() {
        this.focusFromOutside = true;
        super.onUnfocus();
    }

    /* (non-Javadoc)
     * bắt focus field đã chọn
     * @see net.rim.device.api.ui.Manager#onFocus(int)
     */
    public void onFocus(int direction) {
        if (this.daddy)
            return;
        BitmapButtonField field = (BitmapButtonField) getField(this.activeBtnIndex);
        this.daddy = true;
        field.setFocus();
        this.daddy = false;
    }

    /* (non-Javadoc)
     * khi focus thay đổi
     * @see net.rim.device.api.ui.FocusChangeListener#focusChanged(net.rim.device.api.ui.Field, int)
     */
    public void focusChanged(Field field, int eventType) {
    	//trả về nếu ra ngoài or ko có sự kiệm gì 
        if ((!this.focusFromOutside) || (eventType != 1))
            return;
        //duyệt các button
        for (int i = 0; i < this.buttons.size(); i++) {
            BitmapButtonField btn = (BitmapButtonField) this.buttons.elementAt(i);
            if (btn != getFieldWithFocus())
                continue;
            //lưu button trước đó
            this.lastFocusedField = i;
            break;
        }
    }
}
